import axios from 'axios';
import apis from './modules';
import storage from '../commons/storage.js';
import { ElMessage } from 'element-plus';

/**
 * 请求拦截器
 */
axios.interceptors.request.use(
    function (config) {
        config.timeout = 60000;
        config.headers['Authorization'] = storage.get('Authorization') || '';
        return config;
    },
    function (error) {
        return Promise.reject(error);
    }
);

/**
 * 封装http请求函数
 * @param {请求名称} name
 * @param {接口入参} data
 */
const request = function (name = '', data = {}) {
    let {
        url,
        method = 'post',
        headers = {
            'content-type': 'application/json'
        },
        pem = false,
        responseType
    } = getApi(name);

    const item = {
        pem, // 开启pem，页面请求接口自定义处理
        url,
        headers,
        method,
        data,
        responseType
    };

    if (item.method.toUpperCase() === 'GET' || item.method.toUpperCase() === 'DELETE') {
        item.params = item.data;
    }

    return new Promise((resolve, reject) => {
        axios(item)
            .then(resp => {
                successHandler(resp, resolve);
            })
            .catch(err => {
                errorHandler(err.response);
                // reject(err);
            });
    });
};

/**
 * 接口处理
 * @param resp
 * @param resolve
 */
function successHandler(resp, resolve) {
    if (resp.request.responseType === 'arraybuffer') {
        resolve(resp);
    } else {
        // 开启pem，页面请求接口自定义处理
        // todo:是否把401处理提前，401的时候直接提示然后跳转登录
        if (resp.config.pem) {
            resolve(resp.data);
            return;
        }
        // 未开启pem，接口code，sub_code统一处理
        if (resp.data.code === 0) {
            if (resp.data.sub_code === 0) {
                // 如果code和sub_code都为0，直接抛出返回结果
                resolve(resp.data);
            } else {
                // 否则走错误处理
                errorHandler(resp);
            }
        } else {
            // 如果code不为0，处理错误异常
            // 401为登录失效，走登录页面
            if ([401].includes(resp.data.code)) {
                if (location.pathname !== '/login') {
                    ElMessage.error({
                        message: '登录失效，即将为您跳转到登录页…',
                        type: 'error',
                        onClose: () => {
                            location.href = '/login';
                            storage.clear();
                        }
                    });
                }
            } else {
                // 其他错误code走错误提示
                errorHandler(resp);
            }
        }
    }
}

/**
 * 错误接口处理
 * @param error
 */
function errorHandler(resp) {
    const message = resp && resp.data ? `${resp.data.message || resp.data.msg || '系统异常'}` : '异常信息：系统异常';
    ElMessage.error(message);
}

/**
 * 获取请求信息
 * @param {请求名称} name
 */
const getApi = function (name) {
    const api = apis.filter(v => {
        return v.name === name;
    });
    if (api.length === 0) {
        throw new Error(`未找到${name}对应的API服务地址`);
    } else {
        return api[0];
    }
};

export default request;
